/**
 * <h3>ThemeController</h3>
 * <p>大赛信息管理控制器类</p>
 *
 * <h3>功能描述</h3>
 * <p>提供大赛信息的增删改查等基础操作接口，统一返回AjaxResult格式结果</p>
 * <p>支持大赛的创建、编辑、删除、查询等核心功能，包含分页查询、作品管理、比赛详情等</p>
 * <p>所有接口均基于RESTful风格设计，配合SpringMVC与Swagger注解实现标准化API输出</p>
 *
 * <h3>元数据</h3>
 * <ul>
 *     <li>作者：郭强</li>
 *     <li>创建日期：2025年05月18日 14:20:15</li>
 * </ul>
 *
 * <h3>其他信息</h3>
 * <ul>
 *     <li>参考链接：<a href="https://fantastic-admin.hurui.me/guide/permission.html">权限控制文档</a></li>
 *     <li>示例代码：{@code new ThemeController(themeService)} </li>
 * </ul>
 *
 * @apiNote 接口需结合前端权限配置使用，确保安全性；当前部分接口已启用权限注解（如 @PreAuthorize）
 * @implSpec 继承自 {@link BaseController}，复用分页、返回封装等通用逻辑
 * @since 1.0.0
 */
package com.dnndo.web.controller.system;

import com.dnndo.common.annotation.Log;
import com.dnndo.common.core.controller.BaseController;
import com.dnndo.common.core.domain.AjaxResult;
import com.dnndo.common.core.domain.PageResult;
import com.dnndo.common.core.domain.R;
import com.dnndo.common.core.page.TableSupport;
import com.dnndo.common.enums.BusinessType;
import com.dnndo.common.utils.ServletUtils;
import com.dnndo.common.utils.bean.BeanDtoVoUtil;
import com.dnndo.system.domain.dto.ThemeDTO;
import com.dnndo.system.domain.dto.ThemeInfoDTO;
import com.dnndo.system.domain.dto.ThemeQueryDTO;
import com.dnndo.system.domain.dto.WorkDTO;
import com.dnndo.system.domain.vo.*;
import com.dnndo.system.service.ThemeService;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.ApiParam;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;

/**
 * 大赛信息管理控制器类
 */
@RestController
@RequestMapping("/system/theme")
public class ThemeController extends BaseController {

    private final ThemeService themeService;

    @Autowired
    public ThemeController(ThemeService themeService) {
        this.themeService = themeService;
    }

    /**
     * 查询大赛列表（分页）
     * @param dto 查询条件封装对象
     * @return PageResult<ThemeVO> 分页后的结果及总记录数
     * @see com.dnndo.system.domain.vo.ThemeVO
     */
    @PreAuthorize("@ss.hasPermi('system:theme:list')")
    @GetMapping("/list")
    public PageResult<ThemeVO> list(ThemeDTO dto) {
        startPage();
        dto.setUserId(getUserId().intValue());
        List<ThemeDTO> list = themeService.selectThemeList(dto);
        return PageResult.pageOk(BeanDtoVoUtil.listVo(list, ThemeVO.class), new PageInfo<>(list).getTotal());
    }

    /**
     * 获取大赛详情
     * @param themeId 大赛ID
     * @return AjaxResult 包含大赛详细信息
     * @see com.dnndo.system.domain.vo.ThemeVO
     */
    @PreAuthorize("@ss.hasPermi('system:theme:getInfo')")
    @GetMapping("/getInfo")
    public AjaxResult getInfo(@ApiParam("大赛ID") Long themeId) {
        ThemeDTO theme = themeService.selectThemeById(themeId);
        return AjaxResult.success(R.ok(BeanDtoVoUtil.convert(theme, ThemeVO.class)));
    }

    /**
     * 新增大赛
     * @param dto 封装新增数据的DTO对象
     * @return AjaxResult 操作结果
     * @see com.dnndo.system.domain.dto.ThemeDTO
     */
    @Log(title = "大赛管理", businessType = BusinessType.INSERT)
    @PreAuthorize("@ss.hasPermi('system:theme:add')")
    @PostMapping("/add")
    public AjaxResult add(@Validated @RequestBody ThemeDTO dto) {
        dto.setUserId(getUserId().intValue()); // 设置当前用户ID
        return toAjax(themeService.insertTheme(dto));
    }

    /**
     * 修改大赛
     * @param dto 封装更新数据的DTO对象
     * @return AjaxResult 操作结果
     * @see com.dnndo.system.domain.dto.ThemeDTO
     */
    @Log(title = "大赛管理", businessType = BusinessType.UPDATE)
    @PreAuthorize("@ss.hasPermi('system:theme:edit')")
    @PostMapping("/edit")
    public AjaxResult edit(@Validated @RequestBody ThemeDTO dto) {
        return toAjax(themeService.updateThemeById(dto));
    }

    /**
     * 删除大赛
     * @param themeId 要删除的大赛ID
     * @return AjaxResult 操作结果
     * @see com.dnndo.system.domain.dto.ThemeDTO
     */
    @Log(title = "大赛管理", businessType = BusinessType.DELETE)
    @PreAuthorize("@ss.hasPermi('system:theme:del')")
    @GetMapping("/del")
    public AjaxResult del(@ApiParam("大赛ID") Integer themeId) {
        return toAjax(themeService.deleteThemeById(themeId));
    }

    /**
     * 主题大赛查询接口
     * @param params 包含分页参数和查询条件的主题大赛查询对象
     * @return AjaxResult 包含主题大赛列表数据和总记录数的响应结果
     * @see com.dnndo.system.domain.vo.ThemeInfoVO
     */
    @PostMapping("/competition")
    public AjaxResult competition(@RequestBody ThemeInfoDTO params) {
        // 将分页参数设置到请求属性中
        HttpServletRequest request = ServletUtils.getRequest();
        request.setAttribute(TableSupport.PAGE_NUM, params.getPage());
        request.setAttribute(TableSupport.PAGE_SIZE, params.getSize());

        int total;
        total = themeService.countCompetition(params);

        startPage();
        List<ThemeInfoVO> list = themeService.competition(params);

        // 使用 HashMap 构建返回数据
        HashMap<String, Object> dataMap = new HashMap<>();
        dataMap.put("total", total);
        dataMap.put("data", list);

        return AjaxResult.success(dataMap);
    }

    /**
     * 主题大赛详情根据id查询
     * @param dto 包含主题ID的查询对象
     * @return AjaxResult 包含主题大赛详细信息的响应结果
     * @see com.dnndo.system.domain.vo.ThemeQueryVO
     */
    @GetMapping("/theme")
    public AjaxResult theme(ThemeQueryDTO dto) {
        ThemeQueryVO list = themeService.theme(dto);
        return AjaxResult.success(list);
    }

    /**
     * 查询当前主题大赛的所有作品
     * @param dto 包含主题ID、分页参数和语言类型的作品查询对象
     * @return AjaxResult 包含作品列表数据和总记录数的响应结果
     * @see com.dnndo.system.domain.vo.WorkVOEN
     * @see com.dnndo.system.domain.vo.WorkVOZH
     */
    @PostMapping("/work")
    public AjaxResult work(@RequestBody WorkDTO dto) {
        // 将分页参数设置到请求属性中
        HttpServletRequest request = ServletUtils.getRequest();
        request.setAttribute(TableSupport.PAGE_NUM, dto.getPage());
        request.setAttribute(TableSupport.PAGE_SIZE, dto.getSize());

        List<?> listVO;
        int total;
        total = themeService.countTheme(dto);
        // 设置请求分页数据
        startPage();
        if (dto.getLanguage().equals("en")) {
            listVO = BeanDtoVoUtil.listVo(themeService.work(dto), WorkVOEN.class);
        } else {
            listVO = BeanDtoVoUtil.listVo(themeService.work(dto), WorkVOZH.class);
        }

        // 使用 HashMap 构建返回数据
        HashMap<String, Object> dataMap = new HashMap<>();
        dataMap.put("total", total);
        dataMap.put("data", listVO);

        return AjaxResult.success(dataMap);
    }

}
